/*
 * @Author: 0x9DEFA478
 * @Date: 2021-10-09 17:41:03
 * @LastEditTime: 2021-10-10 21:47:00
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __MFRC522_H_
#define __MFRC522_H_
#include "H_Type.h"

#define vMFRC522_ProtocolType_ISO14443_A  1

#define vMFRC522_LL_Function_Type_SPI     1
#define vMFRC522_LL_Function_Type_IIC     2

#define vMFRC522_MFAuthent_AuthentType_A  1
#define vMFRC522_MFAuthent_AuthentType_B  2

//初始化时参数TxSequenceBuffer的长度
#define vMFRC522_TxSequenceBufferLength   19

//初始化时参数RxSequenceBuffer的长度
#define vMFRC522_RxSequenceBufferLength   vMFRC522_TxSequenceBufferLength


typedef struct{

  int Type;//底层传输类型

  void (*Delay)(int);//延时调用

  void (*Reset)();//复位调用

  union{
    void (*Transfer_SPI)(void*,void*,int,int);//传输序列 (发送序列,接收序列,长度,传输速度(0:高速 其他:低速))
    struct{
      int (*Write)(Hbyte,Hbyte*,int);//底层iic写操作 返回 0:成功 其他:失败 (7位器件地址,发送数据,发送数据长度)
      int (*Read)(Hbyte,Hbyte*,int,Hbyte*,int);//底层iic读操作 返回 0:成功 其他:失败 (7位器件地址,发送数据,发送数据长度,接收数据,接收数据长度)
      Hbyte deviceAddr;//器件7位地址
    }Transfer_IIC;
  }TransferSequence;
  
}MFRC522_LL_Function;



typedef struct _MFRC522{
  
  int ProtocolType;

  void* TxSequenceBuffer;//发送缓存
  void* RxSequenceBuffer;//接收缓存

  struct{
    Hbyte (*ReadReg)(struct _MFRC522*,Hbyte);
    void (*ReReadRegToArray)(struct _MFRC522*,Hbyte,Hbyte*,int);
    void (*ReadRegArray)(struct _MFRC522*,Hbyte,Hbyte*,int);
    void (*WriteReg)(struct _MFRC522*,Hbyte,Hbyte);
    void (*ReWriteRegFromArray)(struct _MFRC522*,Hbyte,Hbyte*,int);
    void (*WriteRegArray)(struct _MFRC522*,Hbyte,Hbyte*,int);
  }StaticFunction;

  int LL_Speed;
  MFRC522_LL_Function LL_Function;

  int MFCrypto1On;
  Hbyte Version;

}MFRC522;


//操作返回结果 

#define vMFRC522_Result_RecvTimeOut                                4            //读取超时
#define vMFRC522_Result_RecvTooLong                                3            //接收数据过长
#define vMFRC522_Result_NoCard                                     2            //无响应 未发现卡
#define vMFRC522_Result_ParamError                                 1            //参数错误
#define vMFRC522_Result_Ok                                         0            //操作无错误
#define vMFRC522_Result_Error                                      -1           //出现错误 此情况下IC通信已经无法继续下去且无法恢复，需要复位后再次尝试通信










//============================================================================================================================================
//
// 提供给外部的方法
//
//============================================================================================================================================

/**
 * @brief 初始化RC522
 * @param _this 未使用的句柄
 * @param LL_Function 底层相关回调与信息
 * @param TxSequenceBuffer 底层发送缓存 长度vMFRC522_TxSequenceBufferLength字节
 * @param RxSequenceBuffer 底层接收缓存 长度vMFRC522_RxSequenceBufferLength字节
 * @param Type 协议类型 vMFRC522_ProtocolType_ISO14443_A可选
 * @return 返回执行结果
 */
int MFRC522_Init(MFRC522* _this,MFRC522_LL_Function* LL_Function,void* TxSequenceBuffer,void* RxSequenceBuffer,int ProtocolType);

/**
 * @brief 复位RC522 在通信出现错误时可以使用 复位后开启载波
 * @param _this RC522句柄
 * @return 无
 */
void MFRC522_Reset(MFRC522* _this);

/**
 * @brief 向卡发送数据
 * @param _this RC522句柄
 * @param TxData 发送的数据指针
 * @param TxBitLength 发送的长度 单位Bit 低位在前
 * @param WaitTime 最大等待时间
 * @return 返回执行结果
 */
int MFRC522_Transmit(MFRC522* _this,Hbyte* TxData,Hbyte TxBitLength,int WaitTime);

/**
 * @brief 接收卡发来的数据
 * @param _this RC522句柄
 * @param RxData 容纳接收数据的空间指针
 * @param MaxRxBitLengthPtr 最大接收长度 单位Bit
 * @param RxBitLengthPtr 用于返回接收到的长度 单位Bit 低位在前
 * @param WaitTime 最大等待时间
 * @return 返回执行结果
 */
int MFRC522_Receive(MFRC522* _this,Hbyte* RxData,Hbyte MaxRxBitLengthPtr,Hbyte* RxBitLengthPtr,int WaitTime);

/**
 * @brief 发送后接收数据
 * @param _this RC522句柄
 * @param TxData 发送的数据指针 *这个空间可与RxData为同一个
 * @param TxBitLength 发送的长度 单位Bit 低位在前
 * @param RxData 容纳接收数据的空间指针 *这个空间可与RxData为同一个
 * @param MaxRxBitLengthPtr 最大接收长度 单位Bit
 * @param RxBitLengthPtr 用于返回接收到的长度 单位Bit 低位在前
 * @param WaitTime 最大等待时间
 * @return 返回执行结果
 */
int MFRC522_Transceive(MFRC522* _this,Hbyte* TxData,Hbyte TxBitLength,Hbyte* RxData,Hbyte MaxRxBitLengthPtr,Hbyte* RxBitLengthPtr,int WaitTime);

/**
 * @brief 进行三轮认证
 * @param _this RC522句柄
 * @param SerialNumber 卡ID
 * @param BlockAddr 要验证的块地址
 * @param AuthentType 要验证的密码类型 vMFRC522_MFAuthent_AuthentType_A与vMFRC522_MFAuthent_AuthentType_B可选
 * @param Password 密码序列
 * @return 返回执行结果
 */
int MFRC522_MFAuthent(MFRC522* _this,Hbyte* SerialNumber,Hbyte BlockAddr,int AuthentType,Hbyte* Password);

/**
 * @brief 清除MFCrypto1On位 对一张卡处理完成后调用一次(清除加密状态)
 * @param _this RC522句柄
 * @return 无
 */
void MFRC522_ClearMFCrypto1On(MFRC522* _this);

//============================================================================================================================================
//
// 提供给外部的方法(不一定是顶层必要的方法)
//
//============================================================================================================================================

/**
 * @brief 获取RC522版本号 可使用这个方法判定RC522是否存在
 * @param _this RC522句柄
 * @return 版本号
 */
Hbyte MFRC522_Version(MFRC522* _this);

/**
 * @brief 验证RC522是否存在
 * @param _this RC522句柄
 * @return 返回执行结果
 */
int MFRC522_IsExist(MFRC522* _this);

/**
 * @brief 设置RC522载波状态 可在空闲时关闭载波 节省能源消耗
 * @param _this RC522句柄
 * @param IsEn 是否使能载波
 * @return 无
 */
void MFRC522_SetTxStatus(MFRC522* _this,int IsEn);



#endif //__MFRC522_H_
